<?php

namespace Agp\CoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;
use Agp\AdminBundle\Validator\Constraints as AdminAssert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use APY\DataGridBundle\Grid\Mapping as GRID;

/**
 * Agp\CoreBundle\Entity\Produto
 *
 * @ORM\Table(name="produto")
 * @ORM\Entity(repositoryClass="Agp\CoreBundle\Repository\ProdutoRepository")
 * @ORM\HasLifecycleCallbacks
 * @UniqueEntity(fields={"nome", "empresa"})
 * @UniqueEntity(fields={"empresaInc", "empresa"})
 * 
 * @GRID\Source(columns="codProduto, empresaInc, nome, vlrBase, qtdeAtual, situacao")
 */
class Produto
{
    
    /**
     * @var integer $codProduto
     *
     * @ORM\Column(name="cod_produto", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * 
     * @GRID\Column(title="Código", visible=false, type="text", size="5", primary=true)
     */
    protected $codProduto;
    
    /**
     * @var object $empresa
     *
     * @ORM\ManyToOne(targetEntity="Empresa", fetch="LAZY")
     * @ORM\JoinColumn(name="cod_empresa", referencedColumnName="cod_empresa", onDelete="Cascade", nullable=false)
     */
    protected $empresa;
    
    /**
     *
     * @ORM\OneToMany(targetEntity="ProdutoListaPreco", mappedBy="produto", cascade={"all"})
     */
    protected $produtoReference;
    
    /**
     *
     * @ORM\OneToMany(targetEntity="EventoProduto", mappedBy="produto", cascade={"all"})
     */
    protected $produtoReferenceEvento;

    /**
     * @var string $nome
     *
     * @ORM\Column(name="nome", type="string", length=42, nullable=false)
     * @Assert\NotBlank
     * @Assert\Length(
     *      max = "42"
     * )
     * 
     * @GRID\Column(title="Nome", type="text")
     */
    protected $nome;

    /**
     * @var float $vlrBase
     *
     * @ORM\Column(name="vlr_base", type="float", nullable=true)
     * @Assert\NotBlank
     * 
     * @GRID\Column(title="Valor base", type="number", style="currency")
     */
    protected $vlrBase;

    /**
     * @var float $qtdeMinimo
     *
     * @ORM\Column(name="qtde_minimo", type="float", nullable=true)
     * 
     * @GRID\Column(title="Mínimo", type="text")
     */
    protected $qtdeMinimo;

    /**
     * @var float $qtdeAtual
     *
     * @ORM\Column(name="qtde_atual", type="float", nullable=true)
     * 
     * @GRID\Column(title="Atual", type="text", align="center")
     */
    protected $qtdeAtual;
    
    /**
     *
     * @var integer $empresaInc
     * @ORM\Column(name="empresa_inc", type="integer", nullable=false)
     * 
     * @GRID\Column(title="Código", type="text")
     */
    protected $empresaInc;
    
    /**
     * @ORM\Column(name="ingresso", type="boolean")
     * @var boolen $ingresso
     */
    protected $ingresso;


    const SIT_ATIVO = 'Ativo';
    const SIT_INATIVO = 'Inativo';
    /**
     * @var string $situacao
     *
     * @ORM\Column(name="situacao", type="string", nullable=false)
     * 
     * @GRID\Column(title="Situação", type="text", align="center", filter="select", selectFrom="source")
     */
    protected $situacao;
    
    const CAT_FEMININO = 'FEMININO';
    const CAT_MASCULINO = 'MASCULINO';
    const CAT_UNISSEX = 'INISSEX';
    /**
     * @var string $categoria
     *
     * @ORM\Column(name="categoria", type="string", nullable=true)
     */
    protected $categoria;

    public function __construct() {
        $this->ProdutoList = new ArrayCollection();
        $this->situacao = self::SIT_ATIVO;
        $this->ingresso = false;
    }
    
    public function __toString() {
        return $this->nome;
    }
    
    public function getNomeEstoque(){
        return $this->nome . ' - Estoque: '.$this->qtdeAtual;
    }

    public function atualizaQtde($qted){
        $this->qtdeAtual += $qted;
    }
    
    public function retirarQtde($qtde){
        if ($this->qtdeAtual >= $qtde){
            $this->qtdeAtual -= $qtde;
            return true;
        }else{
            return false;
        }
    }
    
    /**
     * @ORM\PrePersist @ORM\PreUpdate
     */
    public function setZero(){
        if ($this->qtdeAtual == null){
            $this->setQtdeAtual(0);
        }
        
        if ($this->qtdeMinimo == null){
            $this->setQtdeMinimo(0);
        }
        
        if ($this->ingresso == false){
            $this->setCategoria(null);
        }
    }
    
    /* hack for Acls */
    public function getId(){
        return 'class';
    }

    /**
     * Set empresa
     *
     * @param integer $empresa
     * @return Produto
     */
    public function setEmpresa(Empresa $empresa)
    {
        $this->empresa = $empresa;
    
        return $this;
    }

    /**
     * Get empresa
     *
     * @return integer 
     */
    public function getEmpresa()
    {
        return $this->empresa;
    }

    /**
     * Set codProduto
     *
     * @param integer $codProduto
     * @return Produto
     */
    public function setCodProduto($codProduto)
    {
        $this->codProduto = $codProduto;
    
        return $this;
    }

    /**
     * Get codProduto
     *
     * @return integer 
     */
    public function getCodProduto()
    {
        return $this->codProduto;
    }

    /**
     * Set nome
     *
     * @param string $nome
     * @return Produto
     */
    public function setNome($nome)
    {
        $this->nome = mb_strtoupper($nome, 'UTF-8');
        return $this;
    }
    
    /**
     * Get nome
     *
     * @return string 
     */
    public function getNome()
    {
        return $this->nome;
    }

    /**
     * Set vlrBase
     *
     * @param float $vlrBase
     * @return Produto
     */
    public function setVlrBase($vlrBase)
    {
        $this->vlrBase = substr(str_replace(",", ".", $vlrBase),3);
    
        return $this;
    }

    /**
     * Get vlrBase
     *
     * @return float 
     */
    public function getVlrBase()
    {
        return $this->vlrBase;
    }

    /**
     * Set qtdeMinimo
     *
     * @param float $qtdeMinimo
     * @return Produto
     */
    public function setQtdeMinimo($qtdeMinimo)
    {
        $this->qtdeMinimo = $qtdeMinimo;
    
        return $this;
    }

    /**
     * Get qtdeMinimo
     *
     * @return float 
     */
    public function getQtdeMinimo()
    {
        return $this->qtdeMinimo;
    }

    /**
     * Set qtdeAtual
     *
     * @param float $qtdeAtual
     * @return Produto
     */
    public function setQtdeAtual($qtdeAtual)
    {
        $this->qtdeAtual = $qtdeAtual;
    
        return $this;
    }

    /**
     * Get qtdeAtual
     *
     * @return float 
     */
    public function getQtdeAtual()
    {
        return $this->qtdeAtual;
    }
    
    /**
     * Add $produtoReference
     *
     * @param Agp\CoreBundle\Entity\ProdutoReference $produtoReference
     */
    public function addProdutoReference(\Agp\CoreBundle\Entity\Produto $produtoReference)
    {
        $this->produtoReference[] = $produtoReference;
    }

    /**
     * Get produtoReference
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function getProdutoReference()
    {
        return $this->produtoReference;
    }
    
    public function getEmpresaInc() {
        return $this->empresaInc;
    }

    public function setEmpresaInc($empresaInc) {
        $this->empresaInc = $empresaInc;
    }
    
    /**
     * Set situacao
     *
     * @param string $situacao
     * @return TerminalEmpresa
     */
    public function setSituacao($situacao)
    {
        $this->situacao = $situacao;
    
        return $this;
    }

    /**
     * Get situacao
     *
     * @return string 
     */
    public function getSituacao()
    {
        return $this->situacao;
    }
    
    public static function getSituacaoList(){
        return array(self::SIT_ATIVO => self::SIT_ATIVO,
                     self::SIT_INATIVO => self::SIT_INATIVO);
    }
    
    public function isAtivo(){
        return ($this->situacao == self::SIT_ATIVO);

    }
    
    public function getIngresso() {
        return $this->ingresso;
    }

    public function setIngresso($ingresso) {
        $this->ingresso = $ingresso;
    }
    
    public static function getCategoriaList(){
        return array(self::CAT_FEMININO => self::CAT_FEMININO,
                     self::CAT_MASCULINO => self::CAT_MASCULINO,
                     self::CAT_UNISSEX => self::CAT_UNISSEX);
    }
   
    public function getCategoria() {
        return $this->categoria;
    }

    public function setCategoria($categoria) {
        $this->categoria = $categoria;
    }
    
    public function getProdutoReferenceEvento() {
        return $this->produtoReferenceEvento;
    }

    public function setProdutoReferenceEvento($produtoReferenceEvento) {
        $this->produtoReferenceEvento = $produtoReferenceEvento;
    }

}